#include "spritegroup.h"

SpriteGroup::SpriteGroup()
{}

SpriteGroup::~SpriteGroup()
{}

//! Borra todos los sprites del grupo, borrando su memoria asignada.
void SpriteGroup::destroyAll()
{
	for(int i=0; i < group.size(); i++)
		if(group[i])
			delete group[i];	
}
//! Actualiza todos los sprites del grupo
void SpriteGroup::updateAll(unsigned int time_delta)
{
	for(int i=0; i < group.size(); i++)
		if(group[i])
			group[i]->update(time_delta);
}
//! Dibuja todos los sprites del grupo
void SpriteGroup::drawAll(SDL_Surface *surf)
{
	for(int i=0; i < group.size(); i++)
		if(group[i])
			group[i]->draw(surf);
}
	
//! Calcula colisiones de un sprite con el grupo actual
bool SpriteGroup::collideAll(Sprite *spr,
		std::vector<Sprite *> &sprlist,
		std::vector<SDL_Rect> &rectlist)
{
	SDL_Rect r;
    bool ret = false;
	
	for(int i=0; i < group.size(); i++)
		if(group[i])
			if(group[i]->collide(*spr,&r)){
                ret = true;
				sprlist.push_back(group[i]);
				rectlist.push_back(r);
				}
    return ret;
}

//! Ejecuta la funcion func para cada sprite
void SpriteGroup::forEach(void (*func)(Sprite *, void *), void *data)
{
	for(int i=0; i < group.size(); i++)
		if(group[i])
			(*func)(group[i],data);
}

//! Ejecuta func si existe una colisio
void SpriteGroup::forEachCollided(void (*func)(Sprite *, Sprite *, SDL_Rect ,void *),
					 Sprite *spr, void *data)
{
	SDL_Rect r;
	for(int i=0; i < group.size(); i++)
		if(group[i])
		    if(group[i]->collide(*spr,&r))
		         (*func)(group[i],spr,r,data);
}


/* ex: set cindent expandtab softtabstop=4 shiftwidth=4 tabstop=4: */
